/**
 * 将一维的tokens按照DOM的结构，生成多维的数组.
 * "#"和"/"之间的成为子数组
 */

export default function nestTokens (tokens) {
  let nestedToken = [];
  let collector = nestedToken;
  let sections = []; // 栈

  let token, section;
  for (let i = 0, len = tokens.length; i < len; ++i) {
    // 遍历每一个token
    token = tokens[i];

    switch (token[0]) {
      case '#':
        collector.push(token);
        // 一个显然的过程，每碰到一次'#'就要把当前的token入栈
        sections.push(token);
        // 接下来的神来之笔，将collector指向这个 token 的第三位，开始收集子 tokens
        collector = token[2] = [];
        break;
      case '/':
        // 出栈，返回上一层
        // 如果栈空，意味着到目前为止#和/成对出现且全部抵消了
        section = sections.pop();
        collector = sections.length > 0 ? sections[sections.length - 1][2] : nestedToken;
        break;
      default:
        collector.push(token);
    }
  }
  return nestedToken;
}
